package com.moro.lisp;

import com.moro.lisp.tools.FunctionPool;
import com.moro.lisp.tools.MacroPool;
import com.moro.lisp.tools.SymbolPool;
import com.moro.lisp.typedefine.Atom;
import com.moro.lisp.typedefine.Char;
import com.moro.lisp.typedefine.Cons;
import com.moro.lisp.typedefine.Function;
import com.moro.lisp.typedefine.LString;
import com.moro.lisp.typedefine.Macro;
import com.moro.lisp.typedefine.Error;

public class JLispData {//JavaLisp数据的统一类型
	/*
	 * 这个字段存储该数据的类型值，JavaLisp数据类型中一共有7种类型（将来可能会增加），类型值是一个枚举，代表7种数据类型
	 */
	public JLispType type;
	
	
	/*
	 * 这个字段存储的是该数据真正的值，用Object类型存储以便于可以装不同的类型，使用的时候根据type的值强转为对应的类型
	 */
	public Object data;
	
	
	
	
	public JLispData eval(SymbolPool symbolPool, FunctionPool functionPool, MacroPool macroPool) {//对数据求值,如果该数据类型是原子的话，则默认求一般值
		if(JLispType.ATOM == this.type) {
			Atom atom = (Atom)data;
			return atom.eval();
		}else if(JLispType.CONS == this.type) {
			Cons cons = (Cons)data;
			return cons.eval(symbolPool, functionPool, macroPool);
		}else if(JLispType.CHAR== this.type) {
			Char ch = (Char)data;
			return ch.eval();
		}else if(JLispType.STRING == this.type) {
			LString str = (LString)data;
			return str.eval();
		}else if(JLispType.FUNCTION == this.type) {
			Function function = (Function)data;
			return function.eval();
		}else if(JLispType.MACRO == this.type) {
			Macro macro = (Macro)data;
			return macro.eval();
		}else {
			Error error = (Error)data;
			return error.eval();
		}
	}
	
	
	public JLispData(Object data,JLispType type) {
		this.data = data;
		this.type = type;
	}

	/*
	 * 这个方法返回的是对该数据的数据类型的一些文本说明，供使用者参考，不影响JavaLisp的语法
	 */
	public String getTypeExplainText() {
		return null;
	}
	
}
